import unittest
import requests
from api.RegLoginApi import RegLoginApi
from api.InvestApi import InvestApi
from common.DButil import clear_user_info2
from common.read_html_util import html_util
from parameterized import parameterized
from common.resd_json import read_json
from common.init_tender import init_tender_info
from common.utils_assert import common_assert
from api.OpenAccountApi import OpenAccountApi
from api.RechargeApi import RechargeApi


class TestInvest(unittest.TestCase):

    def setUp(self) -> None:
        # 创建session对象
        self.ses = requests.session()
        # 实例化登录模块封装的类
        self.reg_api = RegLoginApi(self.ses)
        # 实例化投资模块封装的类
        self.invest_api = InvestApi(self.ses)
        # 实例化开户模块封装的类
        self.open_account_api = OpenAccountApi(self.ses)
        # 实例化充值模块封装的类
        self.recharge_api = RechargeApi(self.ses)
        # 清洗借款标
        init_tender_info()

    def tearDown(self) -> None:
        # 关闭session对象
        self.ses.close()
        # 清洗操作冗余数据
        init_tender_info()

    # 获取投资测试用例
    @parameterized.expand(read_json("test004_data", "api_data"))
    def test01_get_invest(self, phone, pwd, id, depositCertificate, amount, expect_status_code, expect_status,
                          expect_description):
        # 登录
        RegLoginApi(self.ses).user_login(phone, pwd)
        resp = InvestApi(self.ses).get_investment(id, depositCertificate, amount)
        print(resp.json())
        # 调用投资接口
        self.assertEqual(expect_status_code, resp.status_code)
        self.assertEqual(expect_status, resp.json().get("status"))
        self.assertIn(expect_description, resp.json().get("description"))

    # 第三方投资测试用例
    def test02_the_third_invest(self):
        RegLoginApi(self.ses).user_login("18373444511", "11111MM")
        resp = InvestApi(self.ses).get_investment(642, -1, 100)
        url = html_util(resp)[0]
        body = html_util(resp)[1]
        resp = InvestApi(self.ses).the_third_investment(url, body)
        self.assertEqual(200, resp.status_code)
        self.assertIn("OK", resp.text)

        # 投资业务流程

    # t投资业务流程测试用例
    def test03_tender_process(self):
        # 将使用的数据，设置为变量，方便进行统一管理
        # 1.图片验证码接口
        # 通过调用封装的图片验证码接口的方法，获取响应结果
        # 断言状态码
        resp = self.reg_api.get_img_verify_code(123)
        self.assertEqual(200, resp.status_code)

        # 2.获取短信验证码接口
        # 通过调用封装的短信验证码接口的方法，获取响应结果
        # 断言-通用断言
        clear_user_info2()

        resp = self.reg_api.get_phone_verify_code("18376666666", "8888", "reg")
        common_assert(self, resp, 200, 200, "成功")

        # 3.注册接口
        # 通过调用封装的注册接口的方法，获取响应结果
        # 断言-通用断言
        resp = self.reg_api.user_register("18376666666", "11111MM", "8888", "666666", "on", None)
        common_assert(self, resp, 200, 200, "成功")

        # 4.登录接口
        # 通过调用封装的登录接口的方法，获取响应结果
        # 断言-通用断言
        resp = self.reg_api.user_login("18373444511", "11111MM")
        common_assert(self, resp, 200, 200, "成功")

        # 5.实名认证接口
        # 通过调用封装的实名认证接口的方法，获取响应结果
        # 断言-通用断言
        # 实名认证信息断言
        resp = self.open_account_api.realname("张小白", "110101200503074858")
        common_assert(self, resp, 200, 200, "成功")
        self.assertEqual("110****858", resp.json().get("data").get("card_id"))
        self.assertEqual("张**", resp.json().get("data").get("realname"))

        # 6.开户接口
        # 通过调用封装的开户接口的方法，获取响应结果
        # 断言-通用断言
        data_kh = self.open_account_api.open_account()
        self.assertEqual(200, data_kh.status_code)
        self.assertEqual(200, data_kh.json()["status"])
        self.assertIn("form", data_kh.json()["description"])

        # 7.第三方开户接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        # 通过调用封装的第三方开户接口的方法，传入url和请求体数据，获取响应结果
        # 断言状态码
        # 断言响应体数据
        url = html_util(data_kh)[0]
        form_dict = html_util(data_kh)[1]
        resp = self.open_account_api.third_open_account(url, form_dict)
        self.assertEqual(200, resp.status_code)
        self.assertIn("OK", resp.text)

        # 8.获取充值验证码接口
        # 通过调用封装的获取充值验证码接口的方法，获取响应结果
        # 断言状态码
        resp = self.recharge_api.get_recharge_verify_code(123)
        self.assertEqual(200, resp.status_code)

        # 9.充值接口
        # 通过调用封装的充值接口的方法，获取响应结果
        # 断言-通用断言
        form_data = {"paymentType": "chinapnrTrust", "amount": "100000", "formStr": "reForm", "valicode": "8888"}
        data_cz = self.recharge_api.recharge(form_data)
        self.assertEqual(200, data_cz.status_code)
        self.assertEqual(200, data_cz.json().get("status"))
        self.assertIn("form", data_cz.json().get("description"))

        # 10.第三方充值接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        # 通过调用封装的第三方充值接口的方法，传入url和请求体数据，获取响应结果
        # 断言状态码
        # 断言响应体数据
        url = html_util(data_cz)[0]
        form_dict = html_util(data_cz)[1]
        resp = self.recharge_api.third_recharge(url, form_dict)
        self.assertEqual(200, resp.status_code)
        self.assertIn("OK", resp.text)

        # 11.投资接口
        # 通过调用封装的投资接口的方法，获取响应结果
        # 断言-通用断言
        data_tz = InvestApi(self.ses).get_investment(642, -1, 100)
        # 调用投资接口
        self.assertEqual(200, data_tz.status_code)
        self.assertEqual(200, data_tz.json().get("status"))
        self.assertIn("form", data_tz.json().get("description"))

        # 12.第三方投资接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        # 通过调用封装的第三方投资接口的方法，传入url和请求体数据，获取响应结果
        # 断言状态码
        # 断言响应体数据
        url = html_util(data_tz)[0]
        body = html_util(data_tz)[1]
        resp = InvestApi(self.ses).the_third_investment(url, body)
        self.assertEqual(200, resp.status_code)
        self.assertIn("OK", resp.text)
